/**
 * 面试题 05.02. 二进制数转字符串
 * https://leetcode-cn.com/problems/bianry-number-to-string-lcci/
 */
public class Solutions_mianshi_05_02 {
    public static void main(String[] args) {
//        double num = 0.625;  // output: "0.101"
        double num = 0.1;  // output: "ERROR"

        String result = printBin(num);
        System.out.println(result);
    }

    /**
     * 十进制小数转换为二进制小数：乘 2 取整，逆序排列
     * 十进制整数转换为二进制整数：除 2 取余，顺序排列
     */
    public static String printBin(double num) {
        StringBuilder sb = new StringBuilder();
        sb.append("0.");
        while (num != 0) {
            // 小数乘 2
            num = num * 2;
            if (num >= 1) {
                // 取整数，整数部分为 1
                sb.append("1");
                // 整数部分取出，保留小数部分
                num -= 1;
            } else {
                // 取整数，整数部分为 0
                sb.append("0");
            }
            if (sb.length() > 32) {
                // 数字 num 无法精确地用 32 位以内的二进制表示，即 sb 长度大于 32
                return "ERROR";
            }
        }
        return sb.toString();
    }
}
